public class Solution {
    /**
     * @param nums: an array
     * @param k: an integer
     * @return: rotate the array to the right by k steps
     */
    public int[] rotate(int[] nums, int k) {
        int len = nums.length;
        k %= len;
        if(k == 0)
        return nums;
        int[] first = Arrays.copyOfRange(nums, k, len);
        int[] second = Arrays.copyOfRange(nums, 0, k);
        
        int[] ans = Arrays.copyOf(first, len);
        System.arraycopy(second,0,ans,len-k,k);
        return ans;
    }
}
/*
学习了     
    System.arraycopy(源数组（取数据的数组），源数组的起始位置，目标数组，目标数组放置的起始位置，截取的长度)；
    功能：实现两个数组的合并

    Arrays.copyOf（源数组，新建数组的长度）
    功能：实现新建一个数组并将另一个数组里面的全部的内容拷贝的新数组

    Arrays.copyOfRange（源数组，起始元素下标（截取），结束元素下标（不截取））
    功能：从已有的数组中截取一段数组，并返回一个新的数组
*/
//正解
public class Solution {
    /**
     * @param nums: an array
     * @param k: an integer
     * @return: rotate the array to the right by k steps
     */
    public int[] rotate(int[] nums, int k) {
        // Write your code here
        int n = nums.length;
        k %= n;
        reverse(nums, 0, n - k - 1);
        reverse(nums, n - k, nums.length - 1);
        reverse(nums, 0, nums.length - 1);
        return nums;
    }
    
    public void reverse(int[] n, int i, int j) {
        for (int p = i, q = j; p < q; p++, q--) {
            int temp = n[p];
            n[p] = n[q];
            n[q] = temp;
        }
    }
}
//刷题的时候，辅助函数不可少啊